﻿using System;
using System.Windows.Forms;
using BadgeManager.Controller;
using BadgeManager.Model;

namespace Badge_Manager.View
{
    public partial class frmAggiungiPersona : Form
    {
        private StatoForm stato;
        private frmElencoPersone elenco;
        private Persona persona;
        private Persona nuova;
        private ctrlPersona ctrlPersona = new ctrlPersona();
        private ctrlTessera ctrlTessera = new ctrlTessera();

        public frmAggiungiPersona(StatoForm status, frmElencoPersone elenco, Persona persona = null)
        {
            InitializeComponent();
            this.elenco = elenco;
            stato = status;
            this.persona = persona;
            SettaComboBox(comboTipologia);
            SettaStato(stato);
        }

        public frmAggiungiPersona()
        {
            InitializeComponent();
        }

        private void btnSalva_Click(object sender, System.EventArgs e)
        {
            if (comboTipologia.SelectedIndex < 0 || comboTipologia.SelectedIndex > 2)
            {
                MessageBox.Show("Seleziona una tipologia", "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                comboTipologia.Focus();
                return;
            }
            if (string.IsNullOrEmpty(txtNome.Text))
            {
                MessageBox.Show("Il campo Nome non può essere vuoto", "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtNome.Focus();
                return;
            }
            if (string.IsNullOrEmpty(txtCognome.Text))
            {
                MessageBox.Show("Il campo Cognome non può essere vuoto", "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtCognome.Focus();
                return;
            }
            bool cambioTipo = false;
            if (stato == StatoForm.Nuovo)
            {// se si è nello stato di creazione persona
                if ((TipoPersona)comboTipologia.SelectedItem == TipoPersona.Alunno)
                    persona = new Alunno();
                else if ((TipoPersona)comboTipologia.SelectedItem == TipoPersona.Docente)
                    persona = new Docente();
                else if ((TipoPersona)comboTipologia.SelectedItem == TipoPersona.Dipendente)
                    persona = new Dipendente();
            }
            else if (stato == StatoForm.Modifica)
            {
                if (persona is Alunno || persona is Docente)
                    if (!ctrlPersona.ControllaSeAssociatoAdAttività(persona.Id))
                    {
                        MessageBox.Show("Persona Associata ad un'Attività in Corso, impossibile Modificare");
                        return;
                    }
                if ((TipoPersona)comboTipologia.SelectedItem == TipoPersona.Alunno
                    && !(persona is Alunno))
                {
                    cambioTipo = true;
                    nuova = new Alunno();
                    nuova.Nome = persona.Nome;
                    nuova.Cognome = persona.Cognome;
                    nuova.Note = persona.Note;
                    nuova.Id = persona.Id;
                    nuova.Tessera = persona.Tessera;

                    persona = nuova;
                }
                else if ((TipoPersona)comboTipologia.SelectedItem == TipoPersona.Docente
                    && !(persona is Docente))
                {
                    cambioTipo = true;
                    nuova = new Docente();
                    nuova.Nome = persona.Nome;
                    nuova.Cognome = persona.Cognome;
                    nuova.Note = persona.Note;
                    nuova.Id = persona.Id;
                    persona = nuova;
                    nuova.Tessera = persona.Tessera;
                }
                else if ((TipoPersona)comboTipologia.SelectedItem == TipoPersona.Dipendente
                    && !(persona is Dipendente))
                {
                    cambioTipo = true;
                    nuova = new Dipendente();
                    nuova.Nome = persona.Nome;
                    nuova.Cognome = persona.Cognome;
                    nuova.Note = persona.Note;
                    nuova.Id = persona.Id;
                    persona = nuova;
                    nuova.Tessera = persona.Tessera;
                }
                else
                    nuova = persona;
            }

            persona.Nome = txtNome.Text.Trim();
            persona.Cognome = txtCognome.Text.Trim();
            persona.Note = txtNote.Text.Trim();
            Tessera tesseraDaAssociare = null;
            if (checkAssociaTessera.Checked == true)
            {
                if (stato == StatoForm.Modifica)
                {
                    if (nuova.Tessera != null)
                    {
                        if (MessageBox.Show("La persona ha già una tessera associata, continuare comunque ?",
                            "Attenzione", MessageBoxButtons.OKCancel, MessageBoxIcon.Information)
                            == System.Windows.Forms.DialogResult.Cancel)
                            return;
                    }
                }
                Utility.frmInputBox inputBox = new Utility.frmInputBox("Inserisci Codice", "Codice:");

                if (inputBox.ShowDialog() == System.Windows.Forms.DialogResult.Cancel)
                    return;

                string codice = inputBox.daRitornare;
                if (codice == "")
                {
                    MessageBox.Show("Codice Vuoto, re-inserirlo",
                             "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (codice.Length < 12 || codice.Length > 12)
                {
                    MessageBox.Show("La lunghezza del codice della Tessera deve essere uguale a 12, riprovare",
                        "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                if (Controllo(ref tesseraDaAssociare, codice, ref persona) == false)
                    return;

                ctrlMovimentiTessere cMovimentoTessera = new ctrlMovimentiTessere();
                if (cMovimentoTessera.Nuovo(persona, tesseraDaAssociare)
                    == ctrlMovimentiTessere.Inserimento.Errore) // controlla se avvengono errori
                {
                    MessageBox.Show("Movimento Non Inserito a causa di errori! \n",
                        "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

            if (stato == StatoForm.Nuovo) // se si vuole creare una nuova persona
            {
                try
                {
                    ctrlPersona.InsertPersonaTessera(persona);
                }
                catch (ImpossibileInserire ex)
                {
                    MessageBox.Show(ex.Message, "Attenzione"
                        , MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            else if (stato == StatoForm.Modifica)
            {
                persona = null;
                try
                {
                    ctrlPersona.UpdatePersona(nuova, cambioTipo);
                }
                catch (ImpossibileModificare ex)
                {
                    MessageBox.Show(ex.Message + "\n Persona non modificata"
                        , "Attenzione", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            if (elenco != null)
            {
                if (stato == StatoForm.Modifica)
                    elenco.AggiornaGridDaEsterni(nuova);
                else
                    elenco.AggiornaGridDaEsterni(persona);
            }
            this.Close();
        }

        #region Metodi Vari

        private void SettaComboBox(ComboBox combo)
        {
            foreach (var value in Enum.GetNames(typeof(TipoPersona)))
            {
                combo.Items.Add(Enum.Parse(typeof(TipoPersona), value));
                combo.Items.Remove(TipoPersona.Tutti);
            }
        }

        private void SettaStato(StatoForm status)
        {
            switch (status)
            {
                case StatoForm.Lettura:
                    this.Text += " - Lettura";
                    AbilitaDisabilita(false);
                    RiempiCampi(persona);
                    break;
                case StatoForm.Modifica:
                    this.Text += " - Modifica";
                    RiempiCampi(persona);
                    AbilitaDisabilita(true);
                    break;
                case StatoForm.Nuovo:
                    this.Text += " - Nuovo";
                    AbilitaDisabilita(true);
                    txtCognome.Clear();
                    txtNome.Clear();
                    txtNote.Clear();
                    comboTipologia.SelectedItem = TipoPersona.Alunno;
                    break;
            }
        }

        private void AbilitaDisabilita(bool stato)
        {
            txtNote.Enabled = stato;
            txtNome.Enabled = stato;
            txtCognome.Enabled = stato;
            comboTipologia.Enabled = stato;
            btnSalva.Enabled = stato;
        }

        private void RiempiCampi(Persona persona)
        {
            txtCognome.Text = persona.Cognome;
            txtNome.Text = persona.Nome;
            txtNote.Text = persona.Note;
            if (persona is Alunno)
                comboTipologia.SelectedItem = TipoPersona.Alunno;
            else if (persona is Docente)
                comboTipologia.SelectedItem = TipoPersona.Docente;
            else if (persona is Dipendente)
                comboTipologia.SelectedItem = TipoPersona.Dipendente;
        }

        public bool Controllo(ref Tessera tesseraDaAssociare, string codice, ref Persona personaDaAssociare)
        {
            ctrlTessera ctrlTessera = new ctrlTessera();
            try
            {
                ctrlTessera.ControlloTessera(ref tesseraDaAssociare, codice);
            }
            catch (TesseraNuovaExeption)
            {
                DialogResult scelta = MessageBox.Show("La Tessera non Esiste la vuoi Creare ?",
                    "Attenzione", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
                if (scelta == System.Windows.Forms.DialogResult.OK)
                {
                    tesseraDaAssociare = new Tessera();
                    tesseraDaAssociare.Codice = codice;
                    frmAggiungiTessera frm = new frmAggiungiTessera(StatoForm.Nuovo, tesseraDaAssociare);
                    frm.Top = 300;
                    frm.Left = 400;
                    if (frm.ShowDialog() == System.Windows.Forms.DialogResult.Cancel)
                        return false;
                }
                else
                    return false;
            }
            catch (TesseraAttivaInUnCorsoException ex)
            {
                MessageBox.Show(ex.Message, "Attenzione", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            catch (RiciclareCorsoFinitoException ex)
            {
                DialogResult scelta = MessageBox.Show(ex.Message, "Attenzione", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
                if (scelta == System.Windows.Forms.DialogResult.OK)
                {
                    tesseraDaAssociare.Abilitata = true;
                    ctrlTessera.UpdateTessera(tesseraDaAssociare);
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (TesseraNonAbilitata)
            {
                //ctrlPersona.AnnullaAssociazioneTessera(tesseraDaAssociare.Id);
                tesseraDaAssociare.Abilitata = true;
                ctrlTessera.UpdateTessera(tesseraDaAssociare);
                return true;
            }
            catch (TesseraEsistenteMaNonAssociata)
            {
                tesseraDaAssociare.Abilitata = true;
                ctrlTessera.UpdateTessera(tesseraDaAssociare);
            }
            finally
            {
                personaDaAssociare.Tessera = tesseraDaAssociare;
            }
            return true;
        }

        #endregion Metodi Vari
    }
}